package com.dementors.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.dementors.net.http.volley.VolleyQueue;
import java.util.ArrayList;
import java.util.List;

/**
 * Author  : itxuye(itxuye@gmail.com)|(http://itxuye.com)
 * Date    : 2015-12-06
 * Time    : 16:02
 * FIXME
 */
public class NineImageView extends ViewGroup implements View.OnClickListener {

  /** 图片的边距 */
  private static final int ITEM_PADDING = 4;
  /** 图片的默认尺寸 */
  private static final int ITEM_WIDTH = 300;
  private OnItemClickListener mListener;
  private ImageLoader mImageLoader;
  private List<com.android.volley.toolbox.ImageLoader.ImageContainer> containerList;
  // 还没有充分的利用，用来取消请求
  private List<ImageView> viewList;
  private List<String> mLists;
  private int mDefaultImageId;
  private int mErrorImageId;

  public NineImageView(Context context) {
    this(context, null);
  }

  public NineImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mImageLoader = VolleyQueue.getImageLoader(); // 拿到ImageLoader
  }

  @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mLists != null && mLists.size() > 0) {
      int width = MeasureSpec.getSize(widthMeasureSpec);
      int height = width;
      // 开始继续自己的高度
      // 是宽的1倍(7-9张)还是1/3(1-3张)或者2/3(4-6张)
      int size = mLists.size();
      if (size <= 3) {
        height = width / 3;
      } else if (size <= 6) {
        height = 2 * width / 3;
      } else {
        height = width;
      }
      setMeasuredDimension(width, height);
    } else {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    // 发起请求，不知道这个地方是不是合适。
    // 暂时没发现问题（所有请求都是异步的）
    startReqeustImage(); // TODO
  }

  /** 发起网络请求 */
  private void startReqeustImage() {
    for (ImageView image : viewList) {
      requestImageFromNetWork(image);
    }
  }

  @Override
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    if (mLists != null && mLists.size() > 0) {
      int width = (right - left) / 3; // 每张图片的宽占整个父view的1/3
      int height = width; // 宽和好一样，也就是一个正方形的图片
      layoutItemImage(width, height);
    }
  }

  /** 对相册中的图片进行布局 */
  private void layoutItemImage(int width, int height) {
    // 脑袋不好使，第一次写的很恶心，后来优化成这个样子
    int size = mLists.size() >= 9 ? 9 : mLists.size(); // 只处理9条，大于9时只处理前9条
    int mod = (size == 4) ? 2 : 3; // 4条的时候是2*2，其他都是3*X
    int sLeft, sTop, sRight, sBottom;
    for (int i = 0; i < size; i++) {
      sLeft = (i % mod) * width + ITEM_PADDING;
      sTop = (i / mod) * height + ITEM_PADDING;
      sRight = ((i % mod) + 1) * width - ITEM_PADDING;
      sBottom = ((i / mod) + 1) * height - ITEM_PADDING;
      viewList.get(i).layout(sLeft, sTop, sRight, sBottom);
    }
  }

  @Override protected void onDetachedFromWindow() {
    // TODO 这个地方不知道是否合适
    if (containerList != null && containerList.size() > 0) {
      for (ImageLoader.ImageContainer container : containerList) {
        container.cancelRequest();
      }
    }
    super.onDetachedFromWindow();
  }

  @Override protected void drawableStateChanged() {
    super.drawableStateChanged();
    invalidate();
  }

  /**
   * 设置数据源：数据源的字符串集合
   *
   * @param lists 数据源
   * @param defaultImage 默认显示的图片
   * @param errorImage 加载失败时候显示的图片
   */
  public void setImageList(List<String> lists, int defaultImage, int errorImage) {
    if (defaultImage == 0 || errorImage == 0) {
      return;
    } else {
      mDefaultImageId = defaultImage;
      mErrorImageId = errorImage;
    }

    if (mLists == null) {
      mLists = new ArrayList<String>();
    } else {
      mLists.clear();
    }
    mLists.addAll(lists);

    if (viewList == null) {
      viewList = new ArrayList<ImageView>();
    } else {
      viewList.clear();
    }
    if (containerList == null) {
      containerList = new ArrayList<ImageLoader.ImageContainer>();
    } else {
      for (ImageLoader.ImageContainer container : containerList) {
        container.cancelRequest();
      }
      containerList.clear();
    }

    int size = (mLists.size()) >= 9 ? 9 : mLists.size(); // 默认最多显示9个
    // 这部分是用来实现对view的复用，
    // 当某时刻的某个相册大于等于9就等同于初始化的时候就创建了9个ImageView
    for (int i = 0; i < size; i++) {
      ImageView ivImage = new ImageView(getContext());
      ivImage.setImageResource(mDefaultImageId);
      ivImage.setTag(mLists.get(i));
      ivImage.setOnClickListener(this);
      ivImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
      viewList.add(ivImage);
      this.addView(ivImage);
    }
    invalidate();// requestLayout();
  }

  /** 请求网络图片 */
  private void requestImageFromNetWork(final ImageView ivImage) {

    int width = getMeasuredWidth();
    width = (width == 0) ? ITEM_WIDTH : (width / 3);

    ImageLoader.ImageContainer container =
        mImageLoader.get((String) ivImage.getTag(), new ImageLoader.ImageListener() {

          @Override public void onErrorResponse(VolleyError error) {
            if (mErrorImageId != 0) {
              ivImage.setImageResource(mErrorImageId);
            }
          }

          @Override public void onResponse(ImageLoader.ImageContainer response,
              boolean isImmediate) {
            if (response.getBitmap() != null) {
              ivImage.setImageBitmap(response.getBitmap());
            } else if (mDefaultImageId != 0) {
              ivImage.setImageResource(mDefaultImageId);
            }
          }
        }, width, width);
    containerList.add(container);
  }



  /**
   * 监听item的单击事件
   */
  public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
  }

  /**
   * item(imageview) onclick
   */
  @Override public void onClick(View v) {
    if (mListener != null) {
      mListener.onItemClick(mLists, (String) v.getTag());
    }
  }

  /** 该view的item单击事件接口 */
  public interface OnItemClickListener {
    /**
     * 单击回调，会把所有的url都返回，用户自己计算当前url在所有url中的位置
     *
     * @param mLists 相册所有的url
     * @param url 当前被点击的url
     */
    public void onItemClick(List<String> mLists, String url);
  }
}
